import sqlite3
import os
import re


def execute_sql_file(cursor, file_path):
    """读取并执行SQL文件中的所有语句，支持多条语句"""
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            sql_content = f.read()
        
        # 去除SQL注释并按分号分割语句（处理复杂情况）
        # 移除/* */注释
        sql_content = re.sub(r'/\*.*?\*/', '', sql_content, flags=re.DOTALL)
        # 移除--注释
        sql_content = re.sub(r'--.*$', '', sql_content, flags=re.MULTILINE)
        # 按分号分割语句，忽略空语句
        statements = [stmt.strip() for stmt in sql_content.split(';') if stmt.strip()]
        
        # 逐条执行语句
        for i, stmt in enumerate(statements, 1):
            cursor.execute(stmt)
        print(f"成功执行 {file_path} 中的 {len(statements)} 条语句")
        return True
    
    except sqlite3.Error as e:
        print(f"执行 {file_path} 时出错: {e}")
        return False


# 连接到SQLite数据库，按需修改路径
conn = sqlite3.connect('../../db.sqlite3')
cursor = conn.cursor()

try:
    # 遍历sql文件夹下的.sql文件
    sql_folder = "sql"
    for root, dirs, files in os.walk(sql_folder):
        for file in files:
            if file.endswith(".sql"):
                file_path = os.path.join(root, file)
                if not execute_sql_file(cursor, file_path):
                    # 如果执行失败，可以选择继续执行其他文件或中断
                    print("继续执行其他文件...")
    
    # 所有语句执行成功后提交事务
    conn.commit()
    print("所有SQL文件执行完毕，事务已提交")

except Exception as e:
    # 发生异常时回滚
    conn.rollback()
    print(f"发生错误，已回滚事务: {e}")

finally:
    # 关闭数据库连接
    conn.close()
    print("数据库连接已关闭")
